// 定时句柄
let cancelSetInterval

/**
 * @description 根据传进来的keyName和valName，查找所有模糊匹配该字段的3dTiles数据
 * @param keyName 键名
 * @param valName 键值
 * @param num 查询数量
 */
function searchComponentAll(keyName, valName, num = 20) {
  // console.log('keyName, valName', keyName, valName)
  let arr = []
  let count = num //计数
  all3dTilesArr && all3dTilesArr.map((item) => {
    // console.log('item[keyName]', item[keyName])
    if(count < 1) {
      return arr
    }
    if(item[keyName] && item[keyName].toString().includes(valName)) {
      arr.push({
        id: item.id,
        [keyName]: item[keyName]
      })
      count--
      // console.log(item[keyName])
      // console.log(item)
    }
  })
  return arr
}

/**
 * @description 构件定位跳转
 * @param options 配置项
 * @param complete 完成函数
 * @param cancel 取消函数
 */
const flyToComponent = (options,
  complete = function() {
    // 飞行完成后的回调函数
    console.log('Camera flight completed.')
  },
  cancel = function() {
    // 如果飞行被取消，执行该回调
    console.log('Camera flight canceled.')
  }) => {
  // 合并配置項
  options = {
    position: new Cesium.Cartesian3(),
    duration: 1.5, // 1.5s
    heading: Cesium.Math.toRadians(30),
    pitch: Cesium.Math.toRadians(-90.0),
    roll: 0.0,
    distance: 40,
    viewMatrix: Cesium.Matrix4.IDENTITY,
    immediate: true, //立刻飞到目标位置
    ...options
  }
  console.log('options', options)
  if(options.immediate) {
    // 立刻飞到
    let pickPosition = Cesium.Cartographic.fromCartesian(options.position)
    viewer.camera.setView({
      destination: Cesium.Cartesian3.fromRadians(pickPosition.longitude, pickPosition.latitude, pickPosition.height + options.distance),//返回的三维点表示的是在 WGS84 椭球体上的位置
      // destination: Cesium.Cartesian3.fromRadians(pickPosition.longitude, pickPosition.latitude, pickPosition.height),//返回的三维点表示的是在 WGS84 椭球体上的位置
      orientation: {
        // heading: options.heading, // 观察点左右 ，控制飞机航向
        // pitch: options.pitch, // 远近,上下，俯仰角度
        // roll: options.roll//翻滚
        heading: Cesium.Math.toRadians(0), // 观察点左右 ，控制飞机航向
        pitch: Cesium.Math.toRadians(-90.0), // 远近,上下，俯仰角度
        roll: 0.0 //翻滚
      }
    })
  } else {
    // 方式一
    viewer.camera.flyToBoundingSphere({ center: options.position, radius: options.distance })
    // viewer.camera.flyToBoundingSphere({ center: options.position, radius: options.distance }, {
    //   duration: options.duration,
    //   offset: new Cesium.HeadingPitchRange(options.heading * 5, options.pitch, options.roll * 5)
    // })
    // 方式二
    // viewer.camera.viewBoundingSphere({
    //   center: options.position,
    //   radius: options.distance
    // }, new Cesium.HeadingPitchRange(options.heading, options.pitch, options.roll))

    //-------------------------------
    // let pickPosition = Cesium.Cartographic.fromCartesian(options.position)
    // console.log(pickPosition, '--------')
    // let cta = 30
    // let res = Math.sin(cta)
    // let len = options.distance * res
    // let newPosition = Cesium.Cartesian3.fromRadians(pickPosition.longitude, pickPosition.latitude, len + pickPosition.height)
    // viewer.camera.flyTo({
    //   //目标位置 经度，纬度（弧度），高度
    //   destination: Cesium.Cartesian3.fromRadians(pickPosition.longitude, pickPosition.latitude, 40.0),//返回的三维点表示的是在 WGS84 椭球体上的位置
    //   duration: options.duration,
    //   orientation: {
    //     // heading: options.heading, // 观察点左右 ，控制飞机航向
    //     // pitch: options.pitch, // 远近,上下，俯仰角度
    //     // roll: options.roll //翻滚
    //     heading: Cesium.Math.toRadians(0), // 观察点左右 ，控制飞机航向
    //     pitch: Cesium.Math.toRadians(-60.0), // 远近,上下，俯仰角度
    //     roll: 0.0 //翻滚
    //   }
    // })
  }

}

/**
 * @description 设置整个模型颜色透明度
 * @param item
 * @param option
 */
const set3dTileColor = (item, option) => {
  option = {
    alpha: 1,
    ...option
  }
  // 透明整体建筑
  item.style = new Cesium.Cesium3DTileStyle({
    color: `color('rgba(255,255,255,${option.alpha})')`
  })
}

/**
 * @description 设置构件颜色及透明度
 * @param id 构件id
 * @param option 配置项
 */
const setComponentColor = (id, option) => {
  option = {
    alpha: 1,
    color: Cesium.Color.WHITE,
    ...option
  }
  // 赋予颜色
  all3dTilesObjArr[id] && (all3dTilesObjArr[id].color = option.color.withAlpha(option.alpha))
}

/**
 * @description 设置构件颜色闪烁
 * @param id 构件id
 * @param option 配置项
 */
const setComponentTwinkle = (id, options) => {
  options = {
    alpha: 1,
    colors: [
      Cesium.Color.GREEN,
      Cesium.Color.RED,
      Cesium.Color.BLUE
      // new Cesium.Color(0, 0, 0),
      // new Cesium.Color(1, 1, 1)
    ],
    ...options
  }
  if(cancelSetInterval) {
    clearInterval(cancelSetInterval)
  }
  let flag = options.colors.length
  // 延时赋予颜色
  cancelSetInterval = setInterval(() => {
    flag--
    all3dTilesObjArr[id] && (all3dTilesObjArr[id].color = options.colors[flag])
    if(flag === 0) {
      flag = options.colors.length
    }
    // all3dTilesObjArr[id] && (all3dTilesObjArr[id].color = new Cesium.Color(Math.random() * 255, Math.random() * 255, Math.random() * 255).withAlpha(options.alpha))
  }, 500)
}

/**
 * @description 定位构件
 * @param id 构件id
 * @param options 配置项
 */
const flyTo3dTiles = (id, options) => {
  options = {
    immediate: false,
    distance: 20,
    ...options
  }
  let position = all3dTilesPositionObj[id].sphere
  let cameraInfo = JSON.parse(JSON.stringify(getCameraCoordinate()))
  // 定位跳转
  flyToComponent({
    position: new Cesium.Cartesian3(position[0], position[1], position[2]),
    heading: cameraInfo.heading,
    pitch: cameraInfo.pitch,
    roll: cameraInfo.roll,
    immediate: options.immediate,
    distance: options.distance,
    viewMatrix: cameraInfo.viewMatrix
  })
}

/**
 * @description 退出模型构件查询
 * @param {*}
 */
const existComponetSearch = () => {
  // 还原模型颜色
  restore3dTilesColor()
  // 取消定时器
  if(cancelSetInterval) {
    clearInterval(cancelSetInterval)
  }
}
/**
 * @description 还原构件颜色
 * @param id 构件id
 */
const restoreComponentColor = (id) => {
  all3dTilesObjArr[id].color = new Cesium.Color(255, 255, 255).withAlpha(1)
}

/**
 * @description 还原模型颜色
 */
const restore3dTilesColor = () => {
  for(let i = 0; i < globalTilesetArr.length; i++) {
    globalTilesetArr[i].style = new Cesium.Cesium3DTileStyle({
      color: `color('rgba(255,255,255,1)')`
    })
  }

}

/**
 * @description 设置cesium场景配置项
 */
const setSceneOptions = (options) => {
  options = {
    sun: true,
    moon: true,
    skyBox: true,
    skyAtmosphere: true,
    globe: true,
    sceneBackgroundColor: Cesium.Color.LIGHTSTEELBLUE,
    ...options
  }
  //在Cesium1.6(不确定)之后的版本会显示太阳和月亮，不关闭会影响展示
  viewer.scene.sun.show = options.sun
  viewer.scene.moon.show = options.moon
  //关闭天空盒，否则会显示天空颜色
  viewer.scene.skyBox.show = options.skyBox
  viewer.scene.skyAtmosphere.show = options.skyAtmosphere // 隐藏大气层
  viewer.scene.globe.show = options.globe //不显示地球
  viewer.scene.backgroundColor = options.sceneBackgroundColor  //设置场景背景颜色，默认黑色

}
